/**
 * @title 更新缓存
 * @author start2004
 * @since 2024-08-14
 *
 * @param  {string} key 键值
 * @param {mixed} value 缓存数据
 * @return {null}
 */
export async function SetStorage(key, value) {
  await chrome.storage.local.set({ [key]: value });
}

/**
 * @title 获取缓存
 * @author start2004
 * @since 2024-08-14
 *
 * @param {string} key 缓存键值
 * @return {mixed} 键值对应数据
 */
async function GetStorage(key) {
  const result = await chrome.storage.local.get(key);

  /**
   * @return
   */
  return result[key];
}

/**
 * @title 删除缓存数据
 * @author start2004
 * @since 2024-09-23
 *
 * @param {string} key 缓存键值
 * @return {null}
 */
async function RemoveStorage(key) {
  await chrome.storage.local.remove(key);
}

/**
 * @title 2个数组合并、去重、排序
 * @author start2004
 * @since 2024-09-19
 *
 * @param {array} arr1 数组1
 * @param {array} arr2 数组2
 * @return {array} 合并、去重、排序后的数组
 */
export function MergeUniqueSort(arr1, arr2){
  /**
   * @since 2024-09-19 合并数组
   */
  let arr = arr1.concat(arr2);

  /**
   * @since 2024-09-19 去重
   */
  arr = [...new Set(arr)];

  /**
   * @since 2024-09-19 排序
   */
  arr.sort((a, b) => a - b);

  /**
   * @return
   */
  return arr;
}

/**
 * @title 转换人类可读时间,设置options.html显示的时间
 * @author start2004
 * @since 2024-09-20
 *
 * @param {int} time 时间，单位秒
 * @return {string} 人类可读时间,设置options.html显示的时间
 */
export function HumanTime(time){
  /**
   * @since 2024-09-20 转换object
   */
  const timeObject = TimeObject(time);

  /**
   * @since 2024-09-20 拼接
   */
  let humanTime = "";
  if(timeObject["hour"] > 0){
    humanTime += timeObject["hour"] + chrome.i18n.getMessage("hour");
  } else {}
  if(timeObject["minute"] > 0){
    humanTime += timeObject["minute"] + chrome.i18n.getMessage("minute");
  } else {}
  if(timeObject["second"] > 0){
    humanTime += timeObject["second"] + chrome.i18n.getMessage("second");
  } else {}

  /**
   * @return
   */
  return humanTime;
}

/**
 * @title 插件栏显示的时间
 * @author start2004
 * @since 2024-09-23
 *
 * @param {int} time 时间，单位秒
 * @return {string} 插件栏显示时间
 */
export function BarTime(time){
  /**
   * @since 2025-11-27 判断time是不是数字
   */
  if(time != parseInt(time)) return time;

  /**
   * @since 2024-09-23 转成object
   */
  const timeObject = TimeObject(time);

  /**
   * @since 2024-09-20 拼接
   */
  if(timeObject["hour"] > 0){
    return AddBlank(timeObject["hour"]) + "h";
  } else {}
  if(timeObject["minute"] > 0){
    return AddBlank(timeObject["minute"]) + "m";
  } else {}
  if(timeObject["second"] > 0){
    return "<1m";
    // return AddBlank(timeObject["second"]) + "s";
  } else {
    return "";
  }
}

/**
 * @title 弹窗popup.html显示的时间
 * @author start2004
 * @since 2024-09-23
 *
 * @param {int} time 时间，单位秒
 * @return {string} 弹窗popup.html显示时间
 */
export function ShowTime(time){
  /**
   * @since 2024-09-23 转成object
   */
  if(time <= 0) return "00:00:00";
  const timeObject = TimeObject(time);

  /**
   * @return
   */
  return AddZero(timeObject['hour']) +":"+ AddZero(timeObject['minute']) +":"+ AddZero(timeObject['second']);
}

/**
 * @title 补0操作，凑齐2位，时间小时-分钟-秒
 * @author start2004
 * @since 2024-09-20
 *
 * @param {int} num 时间数字
 * @return {string} 返回补0的数字
 */
function AddZero(num) {
  return num < 10 ? ("0"+num) : (""+num);
}

/**
 * @title 补空格操作，凑齐2位
 * @author start2004
 * @since 2024-09-24
 *
 * @param {int} num 时间数字
 * @return {string} 返回补空格的数字
 */
function AddBlank(num){
  /**
   * @since 2025-08-29 沾满图标上的宽度
   */
  return num < 10 ? ("  "+num) : (""+num);
}

/**
 * @title 转成倒计时时间对象，属性小时，分钟，秒
 * @author start2004
 * @since 2024-09-23
 *
 * @param {int} time 时间，单位秒
 * @return {object} 倒计时时间对象
 */
function TimeObject(time){
  let timeObject = {};
  timeObject['hour'] = parseInt(time / 3600);
  timeObject['minute'] = parseInt((time%3600) / 60);
  timeObject['second'] = time % 60;

  /**
   * @return
   */
  return timeObject;
}

/**
 * @title 获取用户配置信息
 * @author start2004
 * @since 2024-09-19
 *
 * @return {object} 配置信息
 */
export async function GetUserConfig(){
  /**
   * @since 2024-09-19 读取配置
   */
  let config = await GetStorage("user-config");

  /**
   * @since 2024-09-19 默认值
   */
  if(config === undefined){
    config = {
      /**
       * @since 2024-10-31 使用配置default_checked_time，这里需要转Int
       */
      "checked-time" : chrome.i18n.getMessage("default_checked_time").split(",").map(function (item){
        return parseInt(item, 10);
      }),
      // "checked-time" : [300,600,1800,3600],
      "custom-time" : [],
    };
  } else {}

  /**
   * @since 2024-09-29 增加通知方式，通知音频
   */
  if(config["notification"] === undefined){
    config["notification"] = ["tab", "bar"];
  } else {}
  if(config["audio"] === undefined){
    config["audio"] = 1;
  } else {}

  /**
   * @since 2025-02-26 增加页面模式
   */
  if(config["theme-mode"] === undefined){
    config["theme-mode"] = "light";
  } else {}

  /**
   * @return
   */
  // console.log(config);
  return config;
}

/**
 * @description 设置插件栏工具图标
 * @author start2004
 * @since 2025-11-04
 *
 * @param {object} userConfig 用户配置对象
 * @return {null}
 */
export async function setIcon(userConfig){
  let iconPath = chrome.runtime.getURL("assets/images/icon_128.png");
  if(userConfig["theme-mode"] == "dark"){
    iconPath = chrome.runtime.getURL("assets/images/icon_128_dark.png");
  } else {}
  await chrome.action.setIcon({ path: iconPath });
}

/**
 * @title 更新用户配置信息
 * @author start2004
 * @since 2024-09-23
 *
 * @param {object} config 用户配置对象
 * @return {null}
 */
export async function SetUserConfig(config){
  await SetStorage("user-config", config);
}

/**
 * @title 获取倒计时信息
 * @author start2004
 * @since 2024-09-20
 *
 * @return {object} 倒计时配置对象
 */
export async function GetCountdownTimer(){
  /**
   * @since 2024-09-20 倒计时配置
   */
  let timer = await GetStorage("countdown-timer");
  if(!timer){
    timer = InitTimer();
  } else {}

  /**
   * @since 2024-11-01 增加上次执行结束时间
   */
  if(timer["lastendtime"] === undefined){
    timer["lastendtime"] = 0;
  } else {}

  /**
   * @return
   */
  return timer;
}

/**
 * @title 更新倒计时信息
 * @author start2004
 * @since 2024-09-23
 *
 * @param {object} timer 倒计时配置对象
 * @return {null}
 */
export async function SetCountdownTimer(timer){
  await SetStorage("countdown-timer", timer);
}

/**
 * @title 清除倒计时信息
 * @author start2004
 * @since 2024-09-24
 *
 * @return {null}
 */
export async function RemoveCountdownTimer(){
  await RemoveStorage("countdown-timer");
}

/**
 * @title 倒计时初始值
 * @author start2004
 * @since 2024-09-24
 *
 * @return {object} 倒计时信息对象
 */
export function InitTimer(){
  /**
   * @return
   */
  return {
    "pause" : false, // 是否暂停
    "done" : true, // 是否完成倒计时
    "endtime" : 0, // 倒计时结束时间
    "pausetime" : 0, // 暂停后，还剩多少秒倒计时
    "countdowntime" : 0, // 上次倒计时秒数，用户设置值
    "lastendtime": 0, // 上次执行完成时间
  };
}

/**
 * @title 重复开始倒计时
 * @author start2004
 * @since 2024-09-30
 *
 * @param {object} timer 倒计时信息
 * @return {object}
 */
export function RepeatTime(timer){
  /**
   * @since 2024-09-30 重置倒计时
   */
  if(timer.countdowntime == 0) return timer;
  timer.endtime = parseInt(new Date().getTime() / 1000) + timer.countdowntime;
  timer.done = false;
  timer.pause = false;
  timer.pausetime = 0;

  /**
   * @since 2024-09-30 保存时间
   */
  SetCountdownTimer(timer);

  /**
   * @return
   */
  return timer;
}

/**
 * @title 设置当前页面主题
 * @author start2004
 * @since 2025-02-27
 *
 * @param {object} config 用户配置信息
 * @return {null}
 */
export function SetThemeMode(config){
  let dark = false;

  /**
   * @since 2025-11-05 设置图标颜色
   */
  setIcon(config);

  /**
   * @since 2025-02-27 判断chrome浏览器是否深色模式，失败
   */
  // dark = window.matchMedia('(prefers-color-scheme: dark)').matches;
  if (config["theme-mode"] == "dark") dark = true;

  /**
   * @since 2025-02-27 改变外观主题
   */
  if(dark){
    document.body.classList.add('dark-mode');
  } else {
    document.body.classList.remove('dark-mode');
  }
}

/**
 * @title 判断浏览器类型
 * @author start2004
 * @since 2025-08-26
 *
 * @return {string} 浏览器类型，返回'chrome'或'edge'，如果不是这两种浏览器则返回'unknown'
 */
export function GetBrowserType() {
  // 判断是否为Edge浏览器
  // Edge浏览器的navigator.userAgent中包含'Edg/'或'Edge/'
  if (/Edg\//i.test(navigator.userAgent)) {
    return 'edge';
  }
  // 判断是否为Chrome浏览器
  // Chrome浏览器的navigator.userAgent中包含'Chrome/'，但不包含'Edg/'
  else if (/Chrome\//i.test(navigator.userAgent) && !/Edg\//i.test(navigator.userAgent)) {
    return 'chrome';
  }
  // 其他浏览器返回unknown
  else {
    return 'unknown';
  }
}

/**
 * @title 判断是否开发者模式
 * @author start2004
 * @since 2025-08-26
 *
 * @return {boolean} 如果处于调试模式则返回true，否则返回false
 */
export async function IsDebugMode() {
  try {
    // 获取扩展信息
    const extensionInfo = await new Promise((resolve, reject) => {
      chrome.management.getSelf((info) => {
        if (chrome.runtime.lastError) {
          reject(chrome.runtime.lastError);
        } else {
          resolve(info);
        }
      });
    });

    /**
     * @since 2025-08-26 根据安装方式判断
     */
    // 判断installType是否为development
    return extensionInfo.installType === 'development';
  } catch (error) {
    console.error('获取扩展信息失败:', error);
    // 出错时默认返回false
    return false;
  }
}

/**
 * @description 获取版本号
 * @author start2004
 * @since 2025-08-26
 *
 * @return {version} 返回版本号0.1.0，如果开发版本，增加dev-0.1.0
 */
export async function GetVersion(){
  let version = chrome.runtime.getManifest().version;
  let debug = await IsDebugMode();
  if(debug){
    version = "dev-"+ chrome.i18n.getMessage("language") +"-"+ version;
  } else {}

  return version;
}

